﻿using System;
using System.Collections.Generic;
using System.Dynamic;

public static class ExtensionsBLL
{

    /// <summary>
    /// محدوده ی
    /// dynamic
    /// یک
    /// assembly
    /// است. یعنی 
    /// internal
    /// است.
    /// با متد زیر این محدودیت از بین می رود. 
    /// ***:هشدار***
    /// مبحث مربوط به
    /// dynamic
    /// در
    /// data list bound
    /// پشتیبانی نمیشوند.
    /// </summary>
    /// <param name="list"></param>
    /// <returns></returns>
    public static IList<dynamic> ExpandoList(this List<object> list)
    {
        dynamic result = new List<dynamic>();

        foreach (var record in list)
        {
            dynamic expandoObject = new ExpandoObject();
            var iDictionaty = expandoObject as IDictionary<String, object>;

            foreach (var proInfo in record.GetType().GetProperties())
            {
                //اگر مقدار
                //property
                //برابر با
                //null
                //باشد. در خروجی قرار نمی گیرد.
                var value = proInfo.GetValue(record, null) ?? DBNull.Value;

                iDictionaty[proInfo.Name] = value;
            }
            
            result.Add(iDictionaty);
        }

        return result;
    }

    public static dynamic ExpandoRecord(this object record)
    {
        dynamic expandoObject = new ExpandoObject();
        var iDictionary = expandoObject as IDictionary<String, object>;

        foreach (var proInfo in record.GetType().GetProperties())
        {
            //اگر مقدار
            //property
            //برابر با
            //null
            //باشد. در خروجی قرار نمی گیرد.
            var value = proInfo.GetValue(record, null) ?? DBNull.Value;

            iDictionary[proInfo.Name] = value;
        }

        return iDictionary;
    }

}